package controllers

//引入包，深度优先
import (
	"github.com/astaxie/beego"
	"strconv"
)

//定义一个控制器结构体，匿名组合了beego.Controller
type ApiController struct {
	beego.Controller //相当于继承了 beego.Controller, 可使用基于它的所有方法
}

type output struct {
	Code  int
	Err   int
	Msg   string
}


//函数会在下面定义的这些 Method 方法之前执行,可以用来校验之类的,相当于前置中间件
func (this *ApiController) Prepare() {

	//this.Data["json"] = map[string]interface{}{"code": 200,"err":0,"msg":"ok"}//定义返回的json数据

	//ret := output{200,1,"出现错误"}
	//this.Data["json"] = ret

	//this.ServeJSON() //json输出
	//this.StopRun() //终止运行
}

// 定义控制器的方法
// Get、Post、Put、Delete等http动词的方法，当遇到没有自定义方法路由时，会与http动词进行匹配  --固定路由情况
// 也可以在自定义路由中指明访问该方法，则此时它就被当作一个普通方法  --自定义方法路由情况
// this表示指针变量 *ApiController表示指针类型-->this是一个ApiController类型的指针
func (this *ApiController) Get() {
	id := this.Ctx.Input.Param(":id") //获取正则匹配的字
	this.Ctx.WriteString("默认通过http-get 访问的方法"+id)
}

func (this *ApiController) Post() {
	this.Ctx.WriteString("默认通过http-post 访问的方法")
}

func (this *ApiController) Put() {
	this.Ctx.WriteString("默认通过http-put 访问的方法")
}

func (this *ApiController) Delete() {
	this.Ctx.WriteString("默认通过http-delete 访问的方法")
}
// 上面4个方法针对固定路由情况	beego.Router("/api", &controllers.ApiController{})
// get方式访问->Get()
// post方式访问->Post()
// put方式访问->Put()
// delete方式访问->Delete
// 用http什么方法请求就进入对应的方法中处理, 不同http动词访问进入预设的不同同名方法



/********************自定义方法*****************************
需要配合自定义方法路由实现
	beego.Router("/api/add",&controllers.ApiController{},"*:Add;post:Add2")
	beego.Router("/api/see",&controllers.ApiController{},"*:See")
	beego.Router("/api/save",&controllers.ApiController{},"post:Save")
	beego.Router("/api/edit",&controllers.ApiController{},"post:Edit")
	beego.Router("/api/del",&controllers.ApiController{},"delete:Del")

注意:自定义方法路由中的方法名可以是http动词同名方法如:
	beego.Router("/api/get",&controllers.ApiController{},"*:Get")
	这样的话,访问Get()方法就不一定非要用http get方式了,所有http动词都可以

*/

func (this *ApiController) Add() {
	this.Ctx.WriteString("add -any")
}

func (this *ApiController) Add2() {
	this.Ctx.WriteString("add2 -post")
}

func (this *ApiController) Del() {
	this.Ctx.WriteString("delete -delete")
}

func (this *ApiController) Save() {
	this.Ctx.WriteString("save -post")
}

func (this *ApiController) Edit() {
	this.Ctx.WriteString("edit -post")
}

func (this *ApiController) See() {
	this.Ctx.WriteString("see -any")
}

//设置session
func (this *ApiController) SetSess() {
	v := this.GetSession("asta")
	if v == nil {
		this.SetSession("asta", int(1))
		this.Ctx.WriteString("session设置成功,asta值: 1")
	} else {
		this.SetSession("asta", v.(int)+1)
		val := v.(int) + 1
		str := strconv.Itoa(val)
		this.Ctx.WriteString("session设置成功,asta值: "+str)
	}

}

//获取session
func (this *ApiController) GetSess() {
	v := this.GetSession("asta")
	if v == nil {
		this.Ctx.WriteString("session(asta)获取失败")
	} else {
		val := v.(int) //获取session值
		str := strconv.Itoa(val) //int转字符串
		this.Ctx.WriteString("session(asta): "+str)
	}
}